<template>
	<view
		class="uni-card"
		:class="{
			'uni-card--full': isFull,
			'uni-card--shadow': isShadow,
			'uni-card--border': border
		}"
		:style="{
			margin: isFull ? 0 : margin,
			padding: spacing,
			'box-shadow': isShadow ? shadow : ''
		}"
	>
		<!-- 封面 -->
		<slot name="cover">
			<view v-if="cover" class="uni-card__cover">
				<image
					class="uni-card__cover-image"
					mode="widthFix"
					@click="onClick('cover')"
					:src="cover"
				></image>
			</view>
		</slot>
		<slot name="title">
			<view v-if="title || extra" class="uni-card__header">
				<!-- 卡片标题 -->
				<view class="uni-card__header-box" @click="onClick('title')">
					<view v-if="thumbnail" class="uni-card__header-avatar">
						<image
							class="uni-card__header-avatar-image"
							:src="thumbnail"
							mode="aspectFit"
						/>
					</view>
					<view class="uni-card__header-content">
						<text class="uni-card__header-content-title uni-ellipsis">
							{{ title }}
						</text>
						<text
							v-if="title && subTitle"
							class="uni-card__header-content-subtitle uni-ellipsis"
						>
							{{ subTitle }}
						</text>
					</view>
				</view>
				<view class="uni-card__header-extra" @click="onClick('extra')">
					<text class="uni-card__header-extra-text">{{ extra }}</text>
				</view>
			</view>
		</slot>
		<!-- 卡片内容 -->
		<view
			v-if="hasContent"
			class="uni-card__content"
			:style="{ padding: padding }"
			@click="onClick('content')"
		>
			<slot></slot>
		</view>
		<view class="uni-card__actions" @click="onClick('actions')">
			<slot name="actions"></slot>
		</view>
	</view>
</template>

<script>
/**
 * Card 卡片
 * @description 卡片视图组件
 * @tutorial https://ext.dcloud.net.cn/plugin?id=22
 * @property {String} title 标题文字
 * @property {String} subTitle 副标题
 * @property {Number} padding 内容内边距
 * @property {Number} margin 卡片外边距
 * @property {Number} spacing 卡片内边距
 * @property {String} extra 标题额外信息
 * @property {String} cover 封面图（本地路径需要引入）
 * @property {String} thumbnail 标题左侧缩略图
 * @property {Boolean} is-full = [true | false] 卡片内容是否通栏，为 true 时将去除padding值
 * @property {Boolean} is-shadow = [true | false] 卡片内容是否开启阴影
 * @property {String} shadow 卡片阴影
 * @property {Boolean} border 卡片边框
 * @event {Function} click 点击 Card 触发事件
 */
export default {
	name: 'UniCard',
	emits: ['click'],
	props: {
		title: {
			type: String,
			default: ''
		},
		subTitle: {
			type: String,
			default: ''
		},
		padding: {
			type: String,
			default: '10px'
		},
		margin: {
			type: String,
			default: '15px'
		},
		spacing: {
			type: String,
			default: '0 10px'
		},
		extra: {
			type: String,
			default: ''
		},
		cover: {
			type: String,
			default: ''
		},
		thumbnail: {
			type: String,
			default: ''
		},
		isFull: {
			// 内容区域是否通栏
			type: Boolean,
			default: false
		},
		isShadow: {
			// 是否开启阴影
			type: Boolean,
			default: true
		},
		shadow: {
			type: String,
			default: '0px 0px 3px 1px rgba(0, 0, 0, 0.08)'
		},
		border: {
			type: Boolean,
			default: true
		},
		hasContent: {
			type: Boolean,
			default: true
		}
	},
	methods: {
		onClick(type) {
			this.$emit('click', type)
		}
	}
}
</script>

<style lang="scss">
$uni-border-3: #ebeef5 !default;
$uni-shadow-base: 0 0px 6px 1px
	rgba(
		$color: #a5a5a5,
		$alpha: 0.2
	) !default;
$uni-main-color: #3a3a3a !default;
$uni-base-color: #6a6a6a !default;
$uni-secondary-color: #909399 !default;
$uni-spacing-sm: 8px !default;
$uni-border-color: $uni-border-3;
$uni-shadow: $uni-shadow-base;
$uni-card-title: 15px;
$uni-cart-title-color: $uni-main-color;
$uni-card-subtitle: 12px;
$uni-cart-subtitle-color: $uni-secondary-color;
$uni-card-spacing: 10px;
$uni-card-content-color: $uni-base-color;

.uni-card {
	margin: $uni-card-spacing;
	border-radius: 4px;
	overflow: hidden;
	font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
		Microsoft YaHei, SimSun, sans-serif;
	background-color: #fff;
	flex: 1;

	.uni-card__cover {
		position: relative;
		margin-top: $uni-card-spacing;
		flex-direction: row;
		overflow: hidden;
		border-radius: 4px;
		.uni-card__cover-image {
			flex: 1;
			// width: 100%;
			/* #ifndef APP-PLUS */
			vertical-align: middle;
			/* #endif */
		}
	}

	.uni-card__header {
		display: flex;
		flex-direction: row;
		align-items: center;
		padding: $uni-card-spacing;
		overflow: hidden;

		.uni-card__header-box {
			/* #ifndef APP-NVUE */
			display: flex;
			/* #endif */
			flex: 1;
			flex-direction: row;
			align-items: center;
			overflow: hidden;
		}

		.uni-card__header-avatar {
			width: 60px;
			height: 60px;
			overflow: hidden;
			border-radius: 5px;
			margin-right: $uni-card-spacing;
			.uni-card__header-avatar-image {
				flex: 1;
				width: 60px;
				height: 60px;
			}
		}

		.uni-card__header-content {
			/* #ifndef APP-NVUE */
			display: flex;
			/* #endif */
			flex-direction: column;
			justify-content: center;
			flex: 1;
			// height: 40px;
			overflow: hidden;

			.uni-card__header-content-title {
				font-size: $uni-card-title;
				color: $uni-cart-title-color;
				// line-height: 22px;
			}

			.uni-card__header-content-subtitle {
				font-size: $uni-card-subtitle;
				margin-top: 5px;
				color: $uni-cart-subtitle-color;
			}
		}

		.uni-card__header-extra {
			line-height: 12px;

			.uni-card__header-extra-text {
				font-size: 12px;
				color: $uni-cart-subtitle-color;
			}
		}
	}

	.uni-card__content {
		padding: $uni-card-spacing;
		font-size: 14px;
		color: $uni-card-content-color;
		line-height: 22px;
	}

	.uni-card__actions {
		font-size: 12px;
	}
}

.uni-card--border {
	border: 1px solid $uni-border-color;
}

.uni-card--shadow {
	position: relative;
	/* #ifndef APP-NVUE */
	box-shadow: $uni-shadow;
	/* #endif */
}

.uni-card--full {
	margin: 0;
	border-left-width: 0;
	border-left-width: 0;
	border-radius: 0;
}

/* #ifndef APP-NVUE */
.uni-card--full:after {
	border-radius: 0;
}

/* #endif */
.uni-ellipsis {
	/* #ifndef APP-NVUE */
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	/* #endif */
	/* #ifdef APP-NVUE */
	lines: 1;
	/* #endif */
}
</style>
